
typedef int elemtype;

typedef struct double_dir_link_node
{
    elemtype data;
    struct link_node *next;
    struct link_node *prior;
} DDLinkNode, *DDLinkList;

// 双向链表插入
void inseelem(DDLinkList L, elemtype e, DDLinkList p)
{
  // 设 L为双向循环链表结点，在地址为 p 的结点之后插入地址为 s 的新结点
  DDLinkList s, r;
  s = (DDLinkList)malloc(sizeof(DDLinkNode));
  s->data = e; // 建立一个新节点
  r = p->next; // r 指向 p 的后继结点
  s->next = r; // 将 s 的后继指针指向 r
  r->prior = s; // 将 r 的前驱指针指向 s，插在结点s之后
  p->next = s; // 将 p 的后继指针指向 s
  s->prior = p; // 将 s 的前驱指针指向 p
}

// 双向链表的删除操作
void delelem(DDLinkList L, DDLinkList p)
{
  // 设 L为双向循环链表结点，在地址为 p 的结点之后插入地址为 s 的新结点
  DDLinkList q, r;
  q = p->next; // q 指向 p 的后继结点
  r = q->next; // r 指向 q 的后继结点
  p->next = r; // 将 p 的后继指针指向 r
  r->prior = p; // 将 r 的前驱指针指向 p，删除结点q
}
